#11/14
#Python 结构数据类型
#创建合集set，set()用来创建集合的函数，type（）用来查看数据类型
#1、可以使用大括号来进行创建
s = {1,2,3,4}
#2、使用set()函数来进行创建
ss = set('1234')
print(type(s))
print(type(ss))

#集合的添加和删除
#添加元素
s.add(6)
print(s)
#删除集合中的第一个元素
s.pop()
print(s)
#删除集合中的元素
s.remove(4)
print(s)

##创建元组
#创建空元组
tuple1 = ()
print(tuple1)
#创建带有元素的元组，可以有元素类型
tuple2 = (1,'a',3,'hello',2.2)
print(tuple2)
#创建只有一个元素的元组
tuple3 = (1,)
print(type(tuple3))

##使用tuplr()函数将其他数据类型转换为元祖类型。
#语法格式：tuple(数据)
#将字符串转换成元组
tuple1 = tuple('hello,world')
print(tuple1)
#将列表转换成元组
list1 = ['Python','Java','C++','C']
tuple2 = tuple(list1)
print(tuple2)

#从开始索引开始截取，截止到结束索引之前
tuple1 = ('h','e','l','l','o')
##使用索引访问元组中的某个元素
#使用正数索引，从0开始
print(tuple1[2])
#使用负数索引，倒序从-1开始、
print(tuple1[4])

##使用切片访问元组中的一组元素，前闭后开
#使用正数切片
print(tuple1[1: 4])
#指定步长
print(tuple1[1: 4: 2])
#使用负数切片
print(tuple1[-5: -1])

# 11/19
# # 修改元组元素
tuple1 = (12, 34, 56)
tuple2 = ('abc', 'mn')
# # 修改元组元素操作是非法的
tuple1[0] = 100
tuple1[0] = 200
# # 链接元组创建一个新的元组，两个数据必须都是元组
tuple3 = tuple1 + tuple2
print(tuple3)
#
# #元组的删除
t1 = (12, 34, 56[4, 5, 6])
print(t1)
del t1
print(t1)

# #使用input方法输入联系人姓名、电话、邮箱、地址：
h = input('请输入联系人姓名：')
t = input('请输入联系人电话：')
e = input('请输入联系人邮箱地址：')
a = input('请输入联系人地址：')
tuple1 = ('姓名', h, '电话：', t, '邮箱：', e, '地址：', a)
print(tuple1)
#
# # 列表的创建
# # 1.使用[]直接创建：
list1 = [1, 2, 3, "python", 3.1]
print(list1)
print(type(list1))
# # 2.创建空列表
l1 = []
print(l1)
# # 使用list()函数将其他数据类型转化为列表：
# # 1 转化字符串
l2 = list("hello")
print(l2)
# # 2 转化元组
t1 = tuple("hello")
l4 = list(t1)
print(l4)
# # 3 转化range函数
r1 = range(5)
l5 = list(r1)
print(l5)

# 11/21
# 使用索引访问列表中的元素
l1 = ['p','y','t','y','h','q','w']
# 使用正向索引
print(l1[4])
# 使用负向索引
print(l1[-5])

# 使用切片形式访问列表中的元素
l2 = ['p','y','t','h','o','n']
# 使用正数切片，截取索引为2,3,4,的元素，默认步长为1
print(l2[2:5])
# 取索取3-5的元素,末尾
print(l2[3:])
# 取索引0-2的元素，开头
print(l2[:3])
# 取索引1-5，步长2
print(l2[1::2])
# 使用负切片，取后三个元素
print(l2[-3:])
# 使用负切片，取-5到-1，步长是2
print(l2[-5:-1:2])

# 遍历列表
li1= ['python','java','c']
# 使用for循环遍历列表
for item in li1:
    print(item)
l3 = ['python','java','c','c++','r','go','javascript']
for i in l3:
    print(i)

# 修改列表元素
# 修改单个元素
l4 = [10,2,3,4,5,6]
# 将索引为2的元素值修改为100
l4[2] = 100
print(l4)
# 修改多个元素
l5 = [6,7,8,9,10,11,12]
# 修改第1~4个元素值
l5[1:4:1] = [45,-56,98]
print(l5)

# 列表中添加元素
# 1、append()用于在列表的末尾追加元素
l6 = ['a','b','c']
l6.append('f')
print(l6)
# 列表添加列表
l6.append(['e','f'])
print(l6)

# 11/26
# 2、extend（）在列表的末尾一次添加多个元素
l13 = ['a','b','c']
l13.extend('d')
print(l13)
# 列表添加列表
l13.extend(['e','f','g','h'])
print(l13)
l13.extend('world')
print('l13')

# 3、inser（）在列表的特定位置添加想要添加的特定元素
l14 = ['Python','c','Java']
# 插入元素，在索引为2处插入go元素
l14.insert(2,'go')
print(l14)

# 删除元素
# remov删除：remov（）方法是移除掉列表里面的特定元素，但只会删除第一个和指定值相同的元素，而且必须保证该元素是存在的,否则会引发 ValueError 错误
l15 = ['a','b','c','d']
l15.remove('a')
print(l15)

# pop（）方法用来删除列表中指定索引处的元素
l16 = [1,3,4,5,6,7,8,9]
l16.pop(4)
print(l16)
# 删除最后一个元素
l16.pop()
print(l16)

# del 可以用来删除列表中的单个元素或者一段连续的元素。
# 删除单个元素
l17 = [1,4,5,8,6,3,2]
del l17[5]
print(l17)
# 删除8 5 6 这三个元素
del l17[2:5]
print(l17)
# 若将列表中的所有元素删除。可使用列表的clear（）方法
l18 = [5,'a',8,'p',9,0]
l18.clear()
print(l18)

# 创建联系人名单
name_list = []
phone_list = []
while 1:
    print('菜单:1.添加联系人 2.修改联系人 3.删除联系人')
    chioce = input('请输入选择：')
    # 
    if chioce == '1':
        name_list.append(input('请输入联系人姓名：'))
        phone_list.append(input('请输入联系人手机号：'))
        print(name_list)
        print(phone_list)
    # 
    elif chioce == '2':
        num = int(input('请输入联系人编号：'))
        if len(name_list) > 0 and num <= len(name_list):
            name_list[num - 1] = input('修改联系人姓名')
            phone_list[num - 1] = input('修改联系电话')
        else:
            print('联系人编号输入有误')
    # 
    elif chioce == '3':
        num = int(input('请输入联系人编号：'))
        if len(name_list) >0 and nem <= len(name_list):
             name_list.pop(num-1)
             phone_list.pop(num-1)
        else:
            print('联系人编号输入有误')
    else:
        print('显示联系人信息')
        print(name_list)
        print(phone_list)

# 11/28
# # 查找元素 index（）
ls1 = [1,3,5,7,'a','b',8,3,'b',2]
print(ls1.index(3))
print(ls1.index('b',6))
print(ls1.index('b',6,9))
print(ls1.index(0))

# count() 方法用来统计某个元素在列表中出现的次数 列表名.count（统计的value元素）
ls2 = [1,3,5,7,'a','b',8,3,'b',2,5,5,7,1]
print(ls2.count(5))
print(ls2.count(0))
print(ls2.count('b'))

# 元素排序 sort（）函数用于对原列表进行排序，如果指定参数，则使用指定的比较函数。
# 语法格式为：ls.sort(key=None,reverse=False)
# 1、元素是字符串的排序
ls3 = ['1','3','44','23','99','88','56']
# 默认升序
ls3.sort()
print(ls3)
# 降序 reverse=True
ls3.sort(reverse=True)
print(ls3)

# 2、元素是数值的排序
ls4 = [1,3,44,23,99,88,56]
# 默认升序
ls4.sort()
print(ls4)
# 降序 reverse=True
ls4.sort(reverse=True)
print(ls4)

''''字典'''
# 字典的创建
# 1、使用{}创建字典语法格式
# 字典名 = {'key1':'value1','key2':'value',....,'keyn':valuen}
# 使用字符串作为key
d1 = {'数学':95,'英语':90,'语文':80}
print(type(d1))
# 使用元组和数字作为key
d2 = {(20,30):'great',30:[1,2,3]}
print(type(d2))
# 创建空元组
d3 = {}
print(d3)
# 2、用dict（）方法通过关键字的参数来创建字典格式
# 字典名= dict(str1=value1,str2=value2,str3=value3)
d4 = dict(数学=90,语文=89,英语=88)
print(d4)

# 12/3
# 字典元素的访问
# 1、字典名[key]
d5 = {'数学':95, '英语':92, '语文':84}
# 键存在，返回的是值value
print(d5['英语'])
# 键不存在，会引发一个keyrror错误
print(d5['py'])
#
# 2、get（）方法来获取指定键对应的值，语法格式：字典名.get(key[,default])
d6 = {'数学':95, '英语':92, '语文':84}
# 键存在
print(d6.get('语文'))
# 键存在，不写default,会返回None
print(d6.get('py'))
print(d6.get('py','该键不存在'))
#
# 字典添加键值对
d7 = {'数学':95,'英语':92,'语文':84,'py':99}
d7['可视化']=99
print(d7)

# 字典修改键值对
d8 = {'数学':95,'英语':92,'语文':84,'py':99}
d8['英语'] = 100
print(d8)

# 字典删除对
d9 = {'数学':95,'英语':92,'语文':84,'py':99}
# 1、使用del关键字
del d9['语文']
print(d9)
# 2、使用pop()方法
d9.pop('英语')
print(d9)